//
//  AStar.h
//  Taquin
//
//  Created by Benjamin Bouachour on 12/08/11.
//  Copyright 2011 Epitech. All rights reserved.
//

#ifndef _ASTAR_H_
#define _ASTAR_H_

#include <string>
#include <map>
#include <Vector>
#include <string>
#include "IIA.h"
#include "../Graphe/Etat.h"
#include "../Heuristique/IHeuristique.h"
#include "../deff.h"
#include "../Heuristique/Manathan.h"
#include "../AffResult.h"
#include "../Heuristique/Euclidienne.h"
#include "../Heuristique/MyHeuristique.h"

using namespace std;

// pour les perf faire un map avec une string la string = la valeur en string de la grid

typedef map<int, Etat*> a_list;

class Stats {
public:
    int nb_node_visited;
    int node_in_open_list;
    int node_created;    
    int nb_coup;
    int max_node_in_open_list;
    
    void incrementNodeInOpenList();
    void affAll();
    
    Stats();
};

class AStar 
{
    a_list open_list;
    a_list close_list;
    IHeuristique *heuristique;
    Etat *final;
    Etat *initial;
    
    
public:
    AStar(Etat *initial, const Etat *final);
    AStar(Etat *initial, const Etat *final, int heu);
	   AStar(Etat *initial, const Etat *final, string heu);
    AStar(Etat *initial, const Etat *_final, IHeuristique *_heuristique);
    ~AStar();
    

    const void initInitialNode();
    a_list::iterator callStrategie();

    a_list::iterator   isInCloseList(evoisins::iterator it);
    a_list::iterator   isInOpenList(evoisins::iterator it);

    const int getQualite(a_list::iterator it);
    const int getQualite(Etat *it);

    
    const void constructHeuristique(int heu);
    const bool run_Ia();
    
    const a_list &getCloseList() const;
    
    a_list::iterator isInCloseList(Etat *it);
    a_list::iterator isInOpenList(Etat *it);
    void reconstructPath(Etat *state);

};

#endif